//index.js
//获取应用实例
/*
getApp(Object):全局的 getApp() 函数可以用来获取到小程序 App 实例。
参数：
  allowDefault  在 App 未定义时返回默认实现。当App被调用时，默认实现中定义的属性会被覆盖合并到App中。一般用于 独立分包。    值类型：Boolean
*/
/*
注意：
    不要在定义于 App() 内的函数中调用 getApp() ，使用 this 就可以拿到 app 实例。
    通过 getApp() 获取实例之后，不要私自调用生命周期函数。
*/
const app = getApp()
//Page(Object) 函数用来注册一个页面。接受一个 Object 类型参数，其指定页面的初始数据、生命周期回调、事件处理函数等。
Page({
  //页面的初始数据  值类型：Object
  /*
  data 是页面第一次渲染使用的初始数据。
  页面加载时， data 将会以 JSON 字符串的形式由逻辑层传至渲染层，因此 data 中的数据必须是可以转成 JSON 的类型：字符串，数字，布尔值，对象，数组。
  */
  data: {
    motto: 'Hello World',
    userInfo: {},
    hasUserInfo: false,
    canIUse: wx.canIUse('button.open-type.getUserInfo')
  },
  //生命周期回调--监听页面加载  值类型：Function
  /*
  页面加载时触发。一个页面只会调用一次，可以在onLoad 的参数中获取打开当前页面路径中的参数。
  参数： query  打开当前页面路径中的参数  值类型:Object
  */
  onLoad: function () {
    if (app.globalData.userInfo) {
      /*
      Page.prototype.setData(Object data,Function callback)
      参数：
          data  这次要改变的数据   必填值    值类型：Object
          callback   setData引起的界面更新渲染完毕后的回调函数   值类型：Function
      Object 以 key：value的形式表示，将 this.data 中的key 对应的值改变成 value。
      其中 key 可以以数据路径的形式给出，支持改变数组中的某一项或对象的某个属性，如 array[2].message , a.b.c.d , 并且不需要在this.data中预先定义。
      提示：
          1.直接修改 this.data而不调用 this.setData 是无法改变页面的状态的，还会造成数据不一致。
          2.仅支持设置可以 JSON 化的数据。
          3.单次设置的数据不能超过1024KB,请尽量避免一次设置过多的数据。
          3.请不要把data中任何一项的value设为 undefined,否则这项将不被设置并可能遗留一些潜在问题。
      */
      this.setData({
        userInfo: app.globalData.userInfo,
        hasUserInfo: true
      })
    } else if (this.data.canIUse) {
      // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
      // 所以此处加入 callback 以防止这种情况
      app.userInfoReadyCallback = res => {
        this.setData({
          userInfo: res.userInfo,
          hasUserInfo: true
        })
      }
    } else {
      // 在没有 open-type=getUserInfo 版本的兼容处理
      wx.getUserInfo({
        success: res => {
          app.globalData.userInfo = res.userInfo
          this.setData({
            userInfo: res.userInfo,
            hasUserInfo: true
          })
        }
      })
    }
  },
  //生命周期回调--监听页面显示   值类型：Function
  //页面显示/切入前台时触发。
  onShow:function(){
      /*Page.route : 到当前页面的路径，类型为 String。*/
      console.log(this.route)
  },
  //生命周期回调--监听页面初次渲染完成   值类型：Function
  /*
  页面初次渲染完成时触发。一个页面只会调用一次，代表页面已经准备妥当，可以和视图层进行交互。
  提示：
      对界面内进行设置的API 如 wx.setNavigationBarTitle , 请在 onReady 之后进行。
  */
  onReady: function () {

  },
  //生命周期回调--监听页面隐藏
  //页面隐藏/切入后台时触发。如 navigateTo 或 底部 tab 切换到其他页面，小程序切入后台等。
  onHide: function () {

  },
  //生命周期回调--监听页面卸载
  //页面卸载时触发。如 redirectTo 或 navigateBack 到其他页面时。
  onUnload: function () {

  },
  //监听用户下拉动作
  /*
  需要 app.json 的 window 选项中或 页面配置 中开启 enablePullDownRefresh。
  可以通过 wx.startPullDownRefresh 触发下拉刷新，调用后触发下拉刷新动画，效果与用户手动下拉刷新一致。
  当处理完数据刷新后， wx.stopPullDownRefresh 可以停止当前页面的下拉刷新。
  */
  onPullDownRefresh: function () {

  },
  //页面上拉触底事件的处理函数
  /*
  可以在 app.json 的 window 选项中或 页面配置 中设置触发距离 onReachBottomDistance。
  在触发距离内滑动期间，本事件只会被触发一次。
  */
  onReachBottom: function () {

  },
  //用户点击右上角转发
  /*
  监听用户点击页面内转发按钮（<button>组件 open-type="share"）或右上角菜单“转发”按钮的行为，并自定义转发内容。
  提示：
      只有定义了此事件处理函数，右上角菜单才会显示“转发”按钮
  参数：
  from    转发事件来源。button:页面内转发按钮；menu:右上角转发菜单    值类型：String
  target   如果from 值是button , 则 target 是触发这次转发事件的 button ， 否则为 undefined     值类型：Object
  webViewUrl 页面中包含<web-view>组件时，返回当前<web-view>的url   值类型：String
  返回值：Object
  此事件需要return一个Object，用于自定义转发内容，返回内容如下：
  title:转发标题   默认值：当前小程序名称
  path:转发路径  默认值：当前页面path , 必须是以 / 开头的完整路径
  imageUrl：自定义图片路径，可以是本地文件路径、代码包文件件路径或者网络图片路径。支持PNG/JPG。显示长宽比（5:4）    默认值：使用默认截图
  */
  onShareAppMessage: function (res) {
    if(res.from === 'button'){
      //来自页面内转发按钮
      console.log(res.target)
    }
    return {
      title:'自定义转发标题',
      path:'page/user?id=123'
    }
  },
  //页面滚动触发事件的处理函数
  //参数：xcrollTop    页面在垂直方向已滚动的距离（单位px）  值类型：Number
  onPageScroll: function () {

  },
  //当前是tab页时，点击tab时触发
  /*
  参数：
      index     被点击tabItem的序号，从0开始   值类型：String
      pagePath  被点击tabItem的页面路径        值类型：String
      text      被点击tabItem的按钮文字        值类型：String
  */
  onTabItemTap: function (item) {
    console.log(item.index)
    console.log(item.pagePath)
    console.log(item.text)
  },
  //事件处理函数
  /*组件事件处理函数
  Page 中还可以定义组件事件处理函数。在渲染层的组件中加入 事件绑定， 当事件被触发时，就会执行 Page 中定义的事件处理函数。
  */
  bindViewTap: function() {
    wx.navigateTo({
      url: '../logs/logs'
    })
  },
  getUserInfo: function(e) {
    console.log(e)
    app.globalData.userInfo = e.detail.userInfo
    this.setData({
      userInfo: e.detail.userInfo,
      hasUserInfo: true
    })
  }

})
